package com.fqy.ticket.batch.config;

import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.sql.DataSource;
import java.io.IOException;

/**
 * Quartz调度器的核心配置类，负责创建和配置Scheduler实例。
 * 该配置类将自定义的作业工厂(MyJobFactory)与数据源整合到Quartz调度器中。
 */
@Configuration
public class SchedulerConfig {

    /**
     * 注入自定义的作业工厂，用于创建具有Spring依赖注入能力的Quartz作业。
     * 该工厂能够解决Quartz作业无法自动注入Spring管理的Bean的问题。
     */
    @Resource
    private MyJobFactory myJobFactory;

    /**
     * 创建并配置Quartz调度器工厂Bean。
     * 该工厂Bean负责创建和初始化Scheduler实例，整合数据源和自定义作业工厂。
     * @Qualifier("primaryDataSource") // 指定注入名称为"primaryDataSource"的Bean
     *
     * @param dataSource 应用的数据源，用于Quartz存储任务调度信息
     * @return 配置好的SchedulerFactoryBean实例
     * @throws IOException 配置文件读取异常
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("dataSource") DataSource dataSource) throws IOException {
        // 创建调度器工厂实例
        SchedulerFactoryBean factory = new SchedulerFactoryBean();

        // 设置数据源 - 用于Quartz存储作业、触发器等元数据
        // 支持将调度信息持久化到数据库，实现任务的持久化和集群部署
        factory.setDataSource(dataSource);

        // 设置自定义作业工厂 - 确保Quartz作业实例能够被Spring依赖注入管理
        factory.setJobFactory(myJobFactory);

        // 设置启动延迟 - 调度器将在应用启动后延迟指定秒数再启动
        // 提供足够时间让其他组件完成初始化，避免依赖问题
        factory.setStartupDelay(2);

        return factory;
    }
}
